# ---- Stage 1: Build ----
# 使用官方的 Maven 镜像作为构建环境，它包含了 JDK
# 我们明确指定版本以保证构建的可复现性
FROM maven:3.8.5-openjdk-17 AS builder

# 设置工作目录
WORKDIR /app

# 1. 缓存依赖层：
# 只复制 pom.xml 文件，然后下载所有依赖。
# 只要 pom.xml 没有变化，Docker 就会使用这一层的缓存，
# 避免在每次构建时都重新下载海量的依赖，极大地加快了后续构建速度。
COPY pom.xml .
RUN mvn dependency:go-offline

# 2. 复制源代码并打包
# 复制项目的源代码
COPY src ./src

# 运行 Maven 打包命令，生成可执行的 .jar 文件
# -DskipTests 会跳过测试，通常测试应该在 CI/CD 的独立阶段完成
RUN mvn package -DskipTests

# ---- Stage 2: Run ----
# 使用一个非常轻量的 JRE (Java Runtime Environment) 镜像作为最终的运行环境
# 'slim' 版本不包含完整的 JDK，体积小，更安全
FROM openjdk:17-jre-slim

# 设置工作目录
WORKDIR /app

# 安全实践：创建非 root 用户和组来运行应用
# -S 选项创建系统用户/组，没有主目录和密码
RUN addgroup -S spring && adduser -S spring -G spring

# 切换到新创建的非 root 用户
USER spring:spring

# 从 'builder' 阶段复制构建好的 .jar 文件到当前阶段
# 这是多阶段构建的核心：只取走我们需要的最终产物
COPY --from=builder /app/target/*.jar app.jar

# 暴露应用程序的端口
EXPOSE 8080

# 设置容器启动时执行的命令
ENTRYPOINT ["java", "-jar", "app.jar"]